<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * ABM de Clases
 *  
 */
class ABM_Clases extends CI_Controller {
    function __construct() {
        parent::__construct();
        
        //Si el usuario no está logueado redirijo al modulo de login.
        if(!$this->autenticacion->logueado()){
            redirect('admin/usuarios');
        }
        
        //ZONA DE CARGA DE LIBRERIAS, HELPERS Y MODELOS
        $this->load->library('grocery_CRUD');
        
        $this->load->helper('form');
        $this->load->helper('html');
        
        $this->load->model('Cursos_Model');
        $this->load->model('Niveles_Model');
        $this->load->model('Docentes_Model');
        $this->load->model('Comisiones_Model');
        $this->load->model('Salones_Model');
        $this->load->model('Clases_Model');
        $this->load->model('Asistencias_Model');
        $this->load->model('Alumnos_Model');
        
        //ZONA DE INICIALIZACIÓN DE VARIABLES
        $this->encabezado['usuario']=  $this->session->userdata('usuario');
        $this->menu['menu']='comisiones';
        $this->menu['submenu']='clases';
       
    }
    
    function index(){
        $this->abm();
    }
    
    function abm($idComision=NULL){
        //Creo el objeto crud
        $crud = new grocery_CRUD();

        //Defino tabla sobre la que trabajo y tipo de 'Objeto'
        $crud->set_table('Clases');
        
        //Si idComisión está seteado restrinjo a esa comisión.
        if(isset($idComision)){
            $crud->where('idComision', $idComision);
        }
        
        $crud->set_subject('Clase');
        
        //Quito el botones borrar.
        $crud->unset_delete();
        
        //Agrego la acción para cargar la asistencia.
        $crud->add_action('Cargar asistencia', base_url().'assets/grocery_crud/themes/flexigrid/css/images/tilde.png', 'admin/abm_clases/formulario_asistencia','');
        
        //Defino Relaciones 1-n
        $crud->set_relation('idDocente', 'Docentes', '{nombre} {apellido}');
        $crud->set_relation('idSalon', 'Salones', 'nombreSalon');
        
        //Seteo reglas
        $crud->set_rules('idComision', 'Comision', 'required|callback__controlar_comision');
        $crud->set_rules('fecha', 'Fecha', 'required|callback__controlar_fecha_clase');
        $crud->set_rules('idDocente', 'Docente', 'required|callback__controlar_docente_clase');
        $crud->set_rules('idSalon', 'Sal&oacute;n', 'required|callback__controlar_salon_clase');
           
        //Determino como se van a mostrar la columna comisión y el campo.
        $crud->callback_column('idComision', array($this, '_callback_columna_comision'));
        
        //Seteo campos requeridos
        $crud->required_fields('idComision', 'fecha', 'idDocente', 'idSalon');
        
        //Si el idComision está seteado entonces oculto el campo y no lo muestro en
        //las columnas.
        if(isset($idComision)){
            $crud->change_field_type('idComision', 'hidden', $idComision);
            $crud->columns('fecha', 'idDocente', 'idSalon', 'entradaDocente', 'salidaDocente');
        }
        else{
            $crud->callback_field('idComision', array($this, '_callback_campo_comision'));
        }
        
        //Defino nombres para cada campo.
        $crud->display_as('idComision', 'Comision');
        $crud->display_as('fecha', 'Fecha');
        $crud->display_as('idDocente', 'Docente');
        $crud->display_as('idSalon', 'Sal&oacute;n');
        $crud->display_as('entradaDocente', 'Hora de Entrada de Docente');
        $crud->display_as('salidaDocente', 'Hora de Salida de Docente');
        
        $crud->callback_after_insert(array($this, '_callback_insercion'));
        $crud->callback_after_update(array($this, '_callback_edicion'));
        
        //Genero el ABM
        $output=$crud->render();

        //Llamo a la función encargada de mostrar el ABM.
        //Si la comision viene definida muestro una versión mínima para el
        //shadowbox.
        if(isset($idComision)){
            $comision=  $this->_callback_columna_comision($idComision);
            $output->titulo_crud="Clases de $comision";
            $this->mini_crud($output);
        }
        else{
            $this->mostrar_crud($output);
        }
    }
    
    private function mostrar_crud($output = null, $vista='abm_view', $data = NULL) {   
        
        $this->encabezado['abm']=TRUE;
        $this->encabezado['js_files']=$output->js_files;
        $this->encabezado['css_files']=$output->css_files;
        
        $this->load->view('admin/template/encabezado', $this->encabezado);
        $this->load->view('admin/template/menu', $this->menu);
        $this->load->view("admin/abm_clases/$vista", $data);
        $this->load->view('admin/crud/crud_view',$output);	
        $this->load->view('admin/template/footer');
    }
     
    private function mini_crud($output){
        $this->load->view('admin/crud/mini_crud_view',$output);	
    }
   
    function _callback_columna_comision($idComision){
        
        $comision = $this->Comisiones_Model->getComision($idComision);
        
        $curso = $this->Cursos_Model->getCurso($comision['idCurso']) ;
        
        $nivel = $this->Niveles_Model->getNivel($comision['idNivel']);
        
        $diasCursado = "<br/>";
        foreach($this->Comisiones_Model->get_dias_cursado($idComision) as $dia){
            $diasCursado.= $dia['diaSemana']." ".$dia['horaInicio']."  -"; 
        }
        
        $linea = "ID: $idComision - ".$curso['titulo']." - ".$nivel['descripcion'].":$diasCursado"; 
        
        //$linea="hola";
        
        return $linea;
    
    }
    
    function _callback_campo_comision($idComision=""){
        
        $comisiones = $this->Comisiones_Model->get_comisiones();
        
        $comisionesAMostrar=array();
        foreach ($comisiones as $id => $comision){
            $curso = $this->Cursos_Model->getCurso($comision['idCurso']) ;
        
            $nivel = $this->Niveles_Model->getNivel($comision['idNivel']);
        
            $diasCursado = " ";
            foreach($this->Comisiones_Model->get_dias_cursado($comision['idComision']) as $dia){
                $diasCursado.= $dia['diaSemana']." ".$dia['horaInicio']."  - "; 
            }
            
            $comisionesAMostrar[$comision['idComision']] = $curso['titulo']." - ".$nivel['descripcion'].":$diasCursado"; 
        }
        
        $input = "<select name='idComision' class='chosen-select'>";
        foreach($comisionesAMostrar as $clave => $comision){
            $seleccion = ($idComision == $clave)?"selected='selected'":"";
            $input.="<option value='$clave' $seleccion >$comision</option>";
        }
        $input .= "</select>";
        return $input;
    }
    
    function _callback_insercion($post_array){
        //Inserto el registro
        $registro="Insertó clase en comision: ".$post_array['idComision']." para la fecha: ".$post_array['fecha'];
        $this->registro_actividad->cargar_registro($this->session->userdata('id'), $registro);
    }
    
    function _callback_edicion($post_array){
        //Inserto el registro
        $registro="Editó clase en comision: ".$post_array['idComision']." para la fecha: ".$post_array['fecha'];
        $this->registro_actividad->cargar_registro($this->session->userdata('id'), $registro);
    }
    
    /**
    * Con esta función ejecuto una regla que me devuelve los datos que voy a
    * necesitar en las demás reglas. Y los cargo en la sesión del usuario para
    * poder usarlo después.
    * 
    * @param int $str idComision que me pasa el Grocery CRUD
    * @return boolean Devuelve siempre TRUE porque en realidad no hago ningu comprobación.
    */
    function _controlar_comision($str){
        
        //Recupero la comisión.
        $idComision=$str;
        $comision=$this->Comisiones_Model->getComision($idComision);
        
        //Cargo los valores que voy a necesitar en la sesión del usuario.
        $this->session->set_userdata(array('idComision'=>$idComision));
        $this->session->set_userdata(array('idCurso' => $comision['idCurso']));
        $this->session->set_userdata(array('idNivel' => $comision['idNivel']));
        $this->session->set_userdata(array('fechaInicio' => $comision['fechaInicio']));
        
        //Retorno TRUE para que la regla siempre pase sin marcar error.
        return TRUE;
    }
    
    /**
     * Con esta función compruebo las reglas necesarias de la fecha de la clase
     * a saber:
     * - fecha > fechaInicio de la comisión.
     * - fecha != otra fecha guardada para esta comisión.
     * - día de semana de la fecha == dia de semana en se dicta la comisión. 
     * 
     * @param string? $str
     * @return boolean TRUE o FALSE dependiendo si está todo ok o no.
     */
    function _controlar_fecha_clase($str){
        
        $fecha = $str;
        
        //Recupero la fecha de inicio que guardé en la sesión.
        $fechaInicio = $this->session->userdata('fechaInicio');
        //Recupero el id de comision.
        $idComision =  $this->session->userdata('idComision');
        
        //Convierto $fecha al formato Y-m-D
        $fecha =  explode('/', $fecha);
        $fecha = $fecha[2]."-".$fecha[1]."-".$fecha[0];
        
        //Cargo la fecha en la sesión para usarla después.
        $this->session->set_userdata('fecha', $fecha);
        
        $retorno=TRUE;
        
        //Si la fecha de la fecha del formulario es menor a la de inicio de la comisión
        //devulevo el error.
        if( $fecha < $fechaInicio ){
            $retorno = FALSE;
            $this->form_validation->set_message('_controlar_fecha_clase', "La fecha es anterior a la fecha de inicio de la comisi&oacute;n que es $fechaInicio.");
            return $retorno;
        }
        
        //Si la función me devuelve un numero distinto de 0 entonces ya hay una clase
        //cargada para esa fecha.
        $clasesEnFecha = $this->Comisiones_Model->distinta_fecha_clase($idComision, $fecha);
        if($clasesEnFecha != 0){
            $retorno = FALSE;
            $this->form_validation->set_message('_controlar_fecha_clase', 'Ya hay una clase cargada para esa fecha en la comisi&oacute;n.');
            return $retorno;
        }
        
        //La siguiente línea me devuelve un número de 0 a 6. Siendo 0 Domingo y 6 Sábado.
        $diaSemana= date('w', strtotime($fecha));
        
        $diasCursado = $this->Comisiones_Model->get_dias_cursado($idComision);
        
        $diaOk=FALSE;
        foreach($diasCursado as $dia){
            
            switch ($dia['diaSemana']){
                case 'Lunes':{
                        if($diaSemana == 1){
                            $diaOk=TRUE;
                        }
                    break;
                }
                case 'Martes':{
                        if($diaSemana == 2){
                            $diaOk=TRUE;
                        }
                    break;
                }
                case 'Miércoles':{
                        if($diaSemana == 3){
                            $diaOk=TRUE;
                        }
                    break;
                }
                case 'Jueves':{
                        if($diaSemana == 4){
                            $diaOk=TRUE;
                        }
                    break;
                }
                case 'Viernes':{
                        if($diaSemana == 5){
                            $diaOk=TRUE;
                        }
                    break;
                }
                case 'Sábados':{
                        if($diaSemana == 6){
                            $diaOk=TRUE;
                        }
                    break;
                }
            }
        }
        
        if (!($diaOk)){
            $retorno = FALSE;
            $this->form_validation->set_message('_controlar_fecha_clase', 'El día de la semana para el cursado no corresponde con los de la comisión.');
            return $retorno;
        }   
        
        return $retorno;
    }
    
    /**
    * Con esta función compruebo las reglas necesarias de el docente de la clase
    * a saber:
    * - Docente dicta curso de comisión.
    * - Docente tiene el día libre.
    * 
    * @param int $str idDocente
    * @return boolean 
    */
    function _controlar_docente_clase($str){
        $retorno= TRUE;
        $idDocente = $str;
        
        $idCurso = $this->session->userdata('idCurso');
        
        //Compruebo que el docente dicte el curso.
        //Si dicta el curso vale 1 sino 0
        $docenteDictaCurso = $this->Docentes_Model->dicta_curso($idDocente, $idCurso);
        if($docenteDictaCurso ==  0) {
            $retorno = FALSE;
            $this->form_validation->set_message('_controlar_docente_clase', 'El docente no dicta el curso de la comisi&oacute;n cargada.');
            return $retorno;
        }
        
        //Compruebo que no tenga el día ocupado.
        //Si tiene el dia ocupado devuelve 1 sino 0.
        $docenteDiaOcupado = $this->Docentes_Model->dia_ocupado($idDocente, $fecha);
        if($docenteDiaOcupado == 1){
            $retorno = FALSE;
            $this->form_validation->set_message('_controlar_docente_clase', 'El docente ya dicta una clase ese d&iacute;a.');
            return $retorno;
        }
        
        return $retorno;
    }
    /**
    * Con esta función compruebo las reglas necesarias para el salón de la clase
    * a saber:
    * - Salón del tipo que necesita el curso. Computación o Normal.
    * - Salón está libre ese dia.
    * 
    * @param int $str idSalon
    * @return boolean 
    */
    function _controlar_salon_clase($str) {
        $retorno=TRUE;
        
        //Recupero Salón
        $salon = $this->Salones_Model->get_salon($str);
        
        //Recupero Curso
        $curso = $this->Cursos_Model->getCurso($this->session->userdata('idCurso'));
        
        //Recupero fecha de clase
        $fecha = $this->session->userdata('fecha');
        
        //Comparo los tipos de salón
        if($salon['tipoSalon']!=$curso['tipoSalon']){
            $retorno = FALSE;
            $this->form_validation->set_message('_controlar_salon_clase', 'El tipo de sal&oacute;n del Sal&oacute;n seleccionado no corresponde con el del curso.');
            return $retorno;
        }
        
        //Compruebo que no tenga el día ocupado.
        //Si tiene el dia ocupado devuelve 1 sino 0.
        $salonDiaOcupado = $this->Salones_Model->dia_ocupado($str, $fecha);
        if($salonDiaOcupado == 1){
            $retorno = FALSE;
            $this->form_validation->set_message('_controlar_salon_clase', 'El sal&oacute;n ya est&aacute; ocupado el d&iacute;a seleccionado.');
            return $retorno;
        }
        
        return $retorno;
    }
    
    /**
     * Función que muestra el formulario para cargar asistencias.
     * 
     * @param int $idClase
     */
    function formulario_asistencia($idClase){
        //Recupero la clase.
        $clase=$this->Clases_Model->getClase($idClase);
        
        //Aprovecho la función callback para tener un nombre más concreto de la
        //comisión.
        $data['comision'] = $this->_callback_columna_comision($clase['idComision']);
        $data['idComision'] = $clase['idComision'];
        //Paso la fehca para después usarla
        $data['fecha'] = $clase['fecha'];
        //Recupero los alumnos incriptos a la comisión.
        $data['alumnos'] = $this->Alumnos_Model->get_alumnos_comision($clase['idComision']); 
        
        //Cargo la vista y le paso los parámetros.
        $this->load->view('admin/abm_clases/formulario_asistencia_view', $data);
    }
    
    function guardar_asistencia($idComision, $fecha){
        $alumnos=  $this->Alumnos_Model->get_alumnos_comision($idComision);
        
        $this->Asistencias_Model->inicializar_asistencia_para_comision_fecha($idComision, $fecha, $alumnos);
        
        $asistencias = $this->input->post('alumnos');
        
        foreach ($asistencias as $idPersona => $asistencia){
            if($asistencia == TRUE){
                $this->Asistencias_Model->guardar_asistencia($idComision, $fecha, $idPersona);
            }
        }
        
        $registro="Cargó asistencia de la comisión $idComision de la fecha $fecha";
        $this->registro_actividad->cargar_registro($this->session->userdata('id'), $registro);
        
        $this->abm($clase['idComision']);
    }
}
/* End of file abm_clases.php */
/* Location: ./application/controllers/abm_clases.php */